package com.security.test.config;

import com.alibaba.fastjson.JSON;
import com.security.test.redis.RedisService;
import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Component;

import java.util.UUID;
import java.util.concurrent.TimeUnit;

@Slf4j
@Component
public class DefaultTokenManager implements TokenManager {
    // 创建一个 缓存，并定义缓存超时策略为 最后一次访问后超过15分钟后过期
//    private static final Cache<String, Authentication> TokenCache = CacheBuilder.newBuilder()
//            .expireAfterWrite(15, TimeUnit.MINUTES)
//            .expireAfterAccess(15, TimeUnit.MINUTES)
//            .removalListener((RemovalListener<String, Authentication>) notification -> log.info(notification.getKey() + ":" + notification.getCause()))
//            .build();
    @Autowired
    private RedisService redisService;

    @Override
    public String generateToken(Authentication authentication) {
        // 生成token
        String token = UUID.randomUUID().toString();
        // 将token 与 authentication 通过缓存建立关联
        redisService.setCacheObject(token, authentication);
        // 返回token
        return token;
    }

    @Override
    public void removeToken(String token) {
        // 失效缓存数据
        redisService.deleteObject(token);
    }

    @Override
    public Authentication getAuthenticationByToken(String token) {
        // 通过token 获取到用户认证信息
        Authentication authentication = redisService.getCacheObject(token);
        log.info("当前用户信息: {}", JSON.toJSONString(authentication));
        return authentication;
    }

    @Override
    public void delayExpired(String token) {
        // 这里不需要特意去做续期，因为 缓存超时策略为 最后一次访问后超过15分钟后过期 这里只需要读取一次数据就行了
        redisService.expire(token, 15, TimeUnit.SECONDS);
    }
}
